﻿#include <iostream>
using namespace std;

#include <thread>//线程

#include<mutex>//互斥锁

#include <string>

//死锁问题
//线程2等线程1，而线程1也要等线程2，相互等待


//int a = 0;
//mutex mtx1, mtx2;
//
//void func1()
//{
//	for (int i = 0; i < 10000; i++)
//	{
//		//写之前加锁
//		mtx1.lock();//加锁，别的线程不能访问
//		mtx2.lock();
//		
//		a += 1;
//		mtx1.unlock();//解锁
//		mtx2.unlock();
//	}
//}
//
//void func2()
//{
//	for (int i = 0; i < 10000; i++)
//	{
//		//写之前加锁
//		mtx2.lock();//加锁，别的线程不能访问
//		mtx1.lock();
//
//		a += 1;
//		mtx2.unlock();//解锁
//		mtx1.unlock();
//	}
//}
//
//int main(void)
//{
//	thread t1(func1);
//	thread t2(func2);
//	t1.join();
//	t2.join();
//	cout << a << endl;
//	return 0;
//}

//解决方法，拿m1就把m1,m2两个都拿了
/*都是对mtx1进行加锁，获取所有权，当1拿到之后2等待，同一时刻只有1个
*/
int a = 0;
mutex mtx;//互斥量

//void func()
//{
//	for (int i = 0; i < 10000; i++)
//	{
//		//guard 卫兵，警卫
//
//		//自动加锁，解锁
//		lock_guard<mutex> lg(mtx);
//
//		a += 1;		
//	}
//}

//void func()
//{
//	for (int i = 0; i < 10000; i++)
//	{
//		//unique 特有的 独一无二的
//
//		unique_lock<mutex> ulg(mtx);		
//		a += 1;			
//	}
//}

//时间锁
timed_mutex tmtx;
//延迟加锁
void func()
{
	for (int i = 0; i < 2; i++)
	{
		//unique 特有的 独一无二的

		unique_lock<timed_mutex> ulg(tmtx, defer_lock);
		bool isGet = false;
		isGet = ulg.try_lock_for(chrono::seconds(1));//加锁不了，阻塞1秒，1秒后还是加锁不成功，直接返回
		if (isGet)//判断拿没拿到
		{
			this_thread::sleep_for(chrono::seconds(2));//每次都休眠2秒

			a += 1;
		}
				
	}
}

int main(void)
{
	thread t1(func);
	thread t2(func);
	t1.join();
	t2.join();
	cout << a << endl;
	return 0;
}